From: Keir Fraser Date: Tue, 16 Sep 2008 14:57:22 +0000 (+0100) Subject: x86-64: enforce memory limits imposed by virtual memory layout X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14101^2~61 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=42e7334de5176b5f0d4974169ccc585ce4a3af1c;p=xen.git x86-64: enforce memory limits imposed by virtual memory layout ... which currently means: - The 1:1 map cannot deal with more than 1Tb. - The m2p table can handle at most 8Tb. - The page_info array can cover up to e.g. 1.6Gb (<=3D 64 CPUs) or 1Tb (193-256 CPUs). Signed-off-by: Jan Beulich --- diff --git a/xen/arch/x86/e820.c b/xen/arch/x86/e820.c index f09a48aed7..8b79c5ea17 100644 --- a/xen/arch/x86/e820.c +++ b/xen/arch/x86/e820.c @@ -4,6 +4,7 @@ #include #include #include +#include #include /* opt_mem: Limit of physical RAM. Any RAM beyond this point is ignored. */ @@ -327,7 +328,7 @@ static void __init clip_to_limit(uint64_t limit, char *warnmsg) continue; if ( warnmsg ) { - snprintf(_warnmsg, sizeof(_warnmsg), warnmsg, (int)(limit>>30)); + snprintf(_warnmsg, sizeof(_warnmsg), warnmsg, (long)(limit>>30)); printk("WARNING: %s\n", _warnmsg); } printk("Truncating memory map to %lukB\n", @@ -366,8 +367,25 @@ static void __init machine_specific_memory_setup( #ifdef __i386__ clip_to_limit((1ULL << 30) * MACHPHYS_MBYTES, - "Only the first %u GB of the physical memory map " + "Only the first %lu GB of the physical memory map " "can be accessed by Xen in 32-bit mode."); +#else + { + unsigned long limit, mpt_limit, pft_limit; + + limit = DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START; + mpt_limit = ((RDWR_MPT_VIRT_END - RDWR_MPT_VIRT_START) + / sizeof(unsigned long)) << PAGE_SHIFT; + pft_limit = ((FRAMETABLE_VIRT_END - FRAMETABLE_VIRT_START) + / sizeof(struct page_info)) << PAGE_SHIFT; + if ( limit > mpt_limit ) + limit = mpt_limit; + if ( limit > pft_limit ) + limit = pft_limit; + clip_to_limit(limit, + "Only the first %lu GB of the physical " + "memory map can be accessed by Xen."); + } #endif reserve_dmi_region();